/**
 * 常用工具类
 */

export default class Util {
    /**
     * 判断是否为JSON
     * @param val 
     */
    public static isJSON(val) {
        if (typeof val == 'string') {
            try {
                var obj = JSON.parse(val);
                if (typeof obj == 'object' && obj) {
                    return true;
                } else {
                    return false;
                }

            } catch (e) {
                return false;
            }
        }
    }

    /**
     * 获取数据类型
     * @param data 
     */
    public static getDateType(data: any): String {
        let str = Object.prototype.toString.call(data);
        let newStr = str.substring(str.lastIndexOf(' ') + 1, str.lastIndexOf(']'));
        return newStr;
    }

    /**
     * 获取今日日期 xxxx-xx-xx
     */
    public static getTodayStr(): string {
        let dayTime = new Date();
        dayTime.setTime(dayTime.getTime());
        let s = dayTime.getFullYear() + "-" + (dayTime.getMonth() + 1) + "-" + dayTime.getDate();
        return s;
    }

    /**
    * 已知向量求角度
    * @param otherNode 第一个碰撞体的位置
    * @param selfNode 第二个碰撞体的位置
    */
    public static vectorsToDegress(otherNode: cc.Node, selfNode: cc.Node): number {
        // let objectPos = otherNode.node.parent.convertToWorldSpaceAR(otherNode.node.position);
        // let selfPos = selfNode.node.parent.convertToWorldSpaceAR(selfNode.node.position);
        // var dx = objectPos.x - selfPos.x;
        // var dy = objectPos.y - selfPos.y;
        // var dir = cc.v2(dx, dy);
        // var angle = dir.signAngle(cc.v2(1, 0));
        // var degree = angle / Math.PI * 180;
        // return degree;

        let objectPos = selfNode.parent.convertToNodeSpaceAR(otherNode.parent.convertToWorldSpaceAR(otherNode.position)) //转换为node的节点坐标
        let roration = Math.atan2((objectPos.y - selfNode.y), (objectPos.x - selfNode.x))//转换为弧度
        let angle = roration / Math.PI * 180;
        return angle;
    }
    /**
     * 已知角度求向量
     * @param degree 角度
     * @param pos 向量
     */
    public static degreesToVectors(degree: number, comVec: cc.Vec2): cc.Vec2 {
        let radian: number = cc.misc.degreesToRadians(degree);    // 将角度转换为弧度
        // let comVec: cc.Vec2 = pos;    // 一个水平向右的对比向量
        let dirVec: cc.Vec2 = comVec.rotate(radian);    // 将对比向量旋转给定的弧度返回一个新的向量
        return dirVec;
    }

    /**
     * 返回两个数之间的整数
     * @param min 小数
     * @param max 大数
     */
    public static randomTwoNum(min: number, max: number): number {
        var num = max - min + 1;
        return Math.floor(Math.random() * num + min);
    }

    /**
    * 从数组中随机取N个不同不重复的值
    * @param arr 数组
    * @param num 需要取几个
    */
    public static randomArr(arr: Array<any>, num: number): Array<any> {
        if (arr.length === 0) return arr;
        let newArr = [];//创建一个新数组
        for (let i = 0; i < num; i++) {
            let temp = Math.floor(Math.random() * arr.length);//取随机下标
            newArr.push(arr[temp]);//添加到新数组
            arr.splice(temp, 1)//删除当前的数组元素,避免重复
        }
        return newArr;
    }
}

